# -*- coding: utf-8 -*-
import numpy as np;

#创建数组
a = np.array( [ 1, 2, 3, 4] );
b = np.array( [ 5, 6, 7, 8] );
c = np.array( [[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]] );

# 数组的元素类型可以通过dtype 属性获得
print( c.dtype );

# 数组的大小
print( a.shape );
print( c.shape );

# 保持元素个数不变情况下,重新计算生成数组
c.shape = 4,3
print( c );

# 基于a重新创建数组,且共享内存 2维
d = a.reshape((2,2));

a[1] = 100
print( d );

#指定数组内,数据类型
c_1 = np.array( [[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]], dtype=np.float );
print( c_1 );


'''

专门创建数据的函数

'''
# arange 创建一维数组,注意:不包括终值
array_1 = np.arange( 0, 1, 0.1 );
print( array_1 );

# (等差数列) 默认包括终值,endpoint = False 不包括终值
array_2 = np.linspace( 0, 1, 10 );

# (等比数列)
array_3 = np.logspace( 0, 2, 20 );
print( array_3 );

np.empty((2,3),np.int) # 只分配内存，不对其进行初始化
np.zeros(4, np.float) # 元素类型默认为np.float，因此这里可以省略

# zeros_like()、ones_like()、empty_like()
# zeros_like(a) 和 zeros(a.shape, a.dtype) 效果相同

# 使用 frombuffer, fromstring, fromfile，fromfunction 创建数组
# 用 fromfunction 举个栗子

def func(i):
    return i % 4 + 1;

def func_1(i):
    return i % 4 + 1;

# 第一个是 方法名, 数组长度
np.fromfunction( func, ( 10, ) );
np.fromfunction( func_1, ( 9,9 ) ); # 九九乘法表

# 使用整数序列 生成数组 => 不与原数组共享内存
x = np.arange(10,1,-1)
b = x[ [ 3,3,1,8 ] ]; # 取下标为 3,3,1,8 的数值

x[[3,5,1]] = -1, -2, -3; # 整数序列下标也可以用来修改元素的值


'''
布尔数组一般不是手工产生，而是使用布尔运算的ufunc函数产生

'''
x = np.random.rand(10) # 产生一个长度为10，元素值为0-1的随机数的数组
x[x>0.5]  # 使用x>0.5返回的布尔数组收集x中的元素，因此得到的结果是x中所有大于0.5的元素的数组


'''

多维数组生成

'''

# reshape( 列, 行 )[正负代表方向]
array_d = np.arange(0, 60, 10).reshape(-1, 1) + np.arange(0, 6);

# array_d[ 列, 行 ]的取值范围
array_d[ 2::2, 2::2 ]
array_d[(0,1,2,3,4),(1,2,3,4,5)]

'''

结构数组

'''
persontype = np.dtype({ 'names':['name', 'age', 'weight'], 'formats':['S32','i', 'f']})
a = np.array([("Zhang", 32, 75.5), ("Wang", 24, 65.2)], dtype=persontype);

# 结果 a.dtype => dtype([('name', '|S32'), ('age', '<i4'), ('weight', '<f4')])


# 注意元素的值看上去像是组元，实际上它是一个结构

a[0]        # ('Zhang', 32, 75.5)
a[0].dtype  # dtype([('name', '|S32'), ('age', '<i4'), ('weight', '<f4')])

# a[0]是一个结构元素，它和数组a共享内存数据

c = a[1]
c["name"] = "Li"

a[1]["name"] # "Li"


'''
二维数组变以为数组
'''
a.ravel()